
import Head from 'next/head'

<Head>
  <script>
    {
      `(function() {
         var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?e60fb290e204e04c5cb6f79b0ac1e697";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
       })();`
    }
  </script>
</Head>

![LangChain](https://pica.zhimg.com/50/v2-56e8bbb52aa271012541c1fe1ceb11a2_r.gif)



如何使用一个检索器
===

本文档介绍了如何使用一个检索器，该检索器在幕后使用松果（Pinecone）和混合搜索。

这个检索器的逻辑来自于[此文档](https://docs.pinecone.io/docs/hybrid-search)

```python
from langchain.retrievers import PineconeHybridSearchRetriever

```

设置松果（Pinecone）[#](#setup-pinecone "到这个标题的永久链接")
-------------------------------------

您只需要执行这一步。

注意：重要的是确保在元数据中保存文档文本的“上下文”字段未被索引。目前，您需要明确指定要索引的字段。有关更多信息，请查看松果（Pinecone）的[文档](https://docs.pinecone.io/docs/manage-indexes#selective-metadata-indexing)。

```python
import os
import pinecone

api_key = os.getenv("PINECONE_API_KEY") or "PINECONE_API_KEY"
# find environment next to your API key in the Pinecone console
env = os.getenv("PINECONE_ENVIRONMENT") or "PINECONE_ENVIRONMENT"

index_name = "langchain-pinecone-hybrid-search"

pinecone.init(api_key=api_key, enviroment=env)
pinecone.whoami()

```

```python
WhoAmIResponse(username='load', user_label='label', projectname='load-test')

```

```python
 # create the index
pinecone.create_index(
   name = index_name,
   dimension = 1536,  # dimensionality of dense model
   metric = "dotproduct",  # sparse values supported only for dotproduct
   pod_type = "s1",
   metadata_config={"indexed": []}  # see explaination above
)

```

现在创建完成了，我们可以使用它了

```python
index = pinecone.Index(index_name)

```

获取嵌入Embeddings和Sparse编码器[#](#get-embeddings-and-sparse-encoders "到这个标题的永久链接")
---------------------------------------------------------------

嵌入Embeddings用于密集向量，令牌化器用于Sparse向量

```python
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()

```

要将文本编码为Sparse值，您可以选择SPLADE或BM25。对于域外任务，我们建议使用BM25。

有关Sparse编码器的更多信息，请查看pinecone-text库的[文档](https://pinecone-io.github.io/pinecone-text/pinecone_text)。
```python
from pinecone_text.sparse import BM25Encoder
# or from pinecone_text.sparse import SpladeEncoder if you wish to work with SPLADE

# use default tf-idf values
bm25_encoder = BM25Encoder().default()

```

上面的代码使用了默认的tf-idf值。强烈建议将tf-idf值与您自己的语料库相匹配。您可以按如下方式进行：

```python
corpus = ["foo", "bar", "world", "hello"]

# fit tf-idf values on your corpus
bm25_encoder.fit(corpus)

# store the values to a json file
bm25_encoder.dump("bm25_values.json")

# load to your BM25Encoder object
bm25_encoder = BM25Encoder().load("bm25_values.json")

```

构建检索器Load Retriever[#](#load-retriever "Permalink to this headline")
---------------------------------------------------------------

现在我们可以构建检索器了！

```python
retriever = PineconeHybridSearchRetriever(embeddings=embeddings, sparse_encoder=bm25_encoder, index=index)

```

添加文本 Add texts (if necessary)[#](#add-texts-if-necessary "Permalink to this headline")
---------------------------------------------------------------------------------

如果尚未添加到检索器中，我们可以将文本添加到检索器中。

```python
retriever.add_texts(["foo", "bar", "world", "hello"])

```

```python
100%|██████████| 1/1 [00:02<00:00,  2.27s/it]

```

运用检索器 Use Retriever[#](#use-retriever "Permalink to this headline")
-------------------------------------------------------------

现在我们可以使用检索器了！

```python
result = retriever.get_relevant_documents("foo")

```

```python
result[0]

```

```python
Document(page_content='foo', metadata={})

```

